二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
1 2 3 4 5 6 7
| 给定二叉树 [3,9,20,null,null,15,7],
3 / \ 9 20 / \ 15 7
|
返回锯齿形层次遍历如下:
1 2 3 4 5
| [ [3], [20,9], [15,7] ]
|
代码:
98%时 71%空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> ls=new ArrayList<>(); LinkedList<TreeNode> list=new LinkedList<>(); if(root==null)return ls;
list.addLast(root);
TreeNode temp=new TreeNode(-1); //指向自己,并且值为-1 temp.left=temp.right=temp; list.addLast(temp);
temp=list.pollFirst(); int flag=-1; List<Integer> integerList=new LinkedList<>(); while(temp!=null) { if(temp.left==temp.right&&temp.right==temp) { //方向取反 flag=-flag; //把这个反转标志节点重新放回到队列中,标记每一层的结束 list.addLast(temp); //把遍历的结果放入列表中,需要注意方向 if(flag==1) { //不需要反转 ls.add(integerList); } else{ //需要反转 Collections.reverse(integerList); ls.add(integerList); }
//新建链表存新的一层 integerList=new LinkedList<>();
//这是循环跳出的条件,如果加进去的只有这一个 if(list.size()==1)break;
//继续遍历下一个节点 temp=list.pollFirst(); continue; } if(temp.left!=null) list.addLast(temp.left); if(temp.right!=null) list.addLast(temp.right);
integerList.add(temp.val); temp=list.pollFirst(); } return ls; } }
|